/*
 * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgment in the product documentation would be
 * appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

package org.box2dflash.collision.shapes {
	import org.box2dflash.common.*;
	import org.box2dflash.common.math.Mat22;
	import org.box2dflash.common.math.Vec2;
	use namespace Internal;

	public class PolygonDef extends ShapeDef {
		public function PolygonDef() {
			type = Shape.e_polygonShape;
			vertexCount = 0;
		
			for (var i:int = 0;i < Settings._maxPolygonVertices; i++) {
				vertices[i] = new Vec2();
			}
		}

		/// Build vertices to represent an axis-aligned box.
		/// @param hx the half-width.
		/// @param hy the half-height.
		public function setAsBox(hx:Number, hy:Number):void {
			vertexCount = 4;
			vertices[0] = new Vec2(-hx, -hy);
			vertices[1] = new Vec2(hx, -hy);
			vertices[2] = new Vec2(hx, hy);
			vertices[3] = new Vec2(-hx, hy);
		}

		/// Build vertices to represent an oriented box.
		/// @param hx the half-width.
		/// @param hy the half-height.
		/// @param center the center of the box in local coordinates.
		/// @param angle the rotation of the box in local coordinates.
		static private var s_mat:Mat22 = new Mat22();

		public function setAsOrientedBox(hx:Number, hy:Number, center:Vec2 = null, angle:Number = 0.0):void {
			//SetAsBox(hx, hy);
			{
			vertexCount = 4;
			vertices[0] = new Vec2(-hx, -hy);
			vertices[1] = new Vec2(hx, -hy);
			vertices[2] = new Vec2(hx, hy);
			vertices[3] = new Vec2(-hx, hy);
			}
		
			if (center) {
				//XForm xf;
				//xf.position = center;
				var xfPosition:Vec2 = center;
				//xf.R = new Mat22(angle);
				var xfR:Mat22 = s_mat;
				xfR = new Mat22(angle);
			
				for (var i:int = 0;i < vertexCount; ++i) {
					//vertices[i] = Mul(xf, vertices[i]);
					//var a:Vec2 = MulMV(T.R, v);
					center = vertices[i];
					hx = xfPosition.x + (xfR.col1.x * center.x + xfR.col2.x * center.y);
					center.y = xfPosition.y + (xfR.col1.y * center.x + xfR.col2.y * center.y);
					center.x = hx;
				}
			}
		}

		/// The polygon vertices in local coordinates.
		public var vertices:Array = new Array(Settings._maxPolygonVertices);
		/// The number of polygon vertices.
		public var vertexCount:int;
	}
}
